home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / hardware / cdrom_c / cdplay.c < prev    next >
C/C++ Source or Header  |  1994-07-21  |  13KB  |  533 lines

  1. /*                           CDROM AUDIO PLAYER
  2.                   By Barry Egerter
  3.  
  4.                 Written July 18, 1994
  5.  
  6.                 Using Borland C++ 3.1
  7.  
  8.          Code and program: FREEWARE - alter and use at will.
  9.  
  10.  
  11.            Internet Email:      barry.egerter@softnet.com
  12. */
  13.  
  14. #include <dos.h>
  15. #include <mem.h>
  16. #include <conio.h>
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <process.h>
  20. #include <ctype.h>
  21. #include "cdrom.h"
  22. /******************************PLAYER PROGRAM*******************************/
  23.  
  24. /* VARIABLES GLOBAL TO TEST PROGRAM */
  25.   struct playinfo my_cd;
  26.   struct volumeinfo my_vol;
  27.   unsigned char minutes, seconds, frames;
  28.   short screeny, ctr, done, playing, paused;
  29.   unsigned long disklen, mark[900];
  30.   unsigned char ch, playmode, curupc[7];
  31.   unsigned short curcheck, curmark;
  32.   unsigned long oldstatus = 0;
  33. #define TRUE 1
  34. #define FALSE 0
  35. #define PLAY_DISK 0
  36. #define PLAY_TRACK 1
  37. #define PLAY_SHUFFLE 2
  38.  
  39. void show_status (void);
  40. void show_mode (void);
  41. void newdisk (void);
  42.  
  43. void show_status (void)
  44. {
  45.   unsigned char diskid[6];
  46.  
  47.   cd_status ();
  48.   oldstatus = cdrom_data.status;
  49.   textbackground (BLUE);
  50.   textcolor (WHITE);
  51.  
  52.   gotoxy (42, 1);
  53.   if (cdrom_data.status & 1)
  54.     cprintf ("Door open  ");
  55.   else cprintf ("Door closed");
  56.  
  57.   gotoxy (42, 2);
  58.   if (cdrom_data.status & 2)
  59.     cprintf ("Door unlocked");
  60.   else cprintf ("Door locked  ");
  61.  
  62.   gotoxy (42, 3);
  63.   if (cdrom_data.status & 4)
  64.     cprintf ("Supports raw & cooked reading");
  65.   else cprintf ("Cooked reading only          ");
  66.  
  67.   gotoxy (42, 4);
  68.   if (cdrom_data.status & 8)
  69.     cprintf ("Writable!");
  70.   else cprintf ("Read Only");
  71.  
  72.   gotoxy (42, 5);
  73.   if (cdrom_data.status & 16)
  74.     cprintf ("Can play audio/video tracks");
  75.   else cprintf ("Data read only              ");
  76.  
  77.   gotoxy (42, 6);
  78.   if (cdrom_data.status & 128)
  79.     cprintf ("Supports prefetch requests");
  80.   else cprintf ("No prefetching             ");
  81.  
  82.   gotoxy (42, 7);
  83.   if (cdrom_data.status & 256)
  84.     cprintf ("Supports audio channel control");
  85.   else cprintf ("No audio channel manipulation ");
  86.  
  87.   gotoxy (42, 8);
  88.   if (cdrom_data.status & 512)
  89.     cprintf ("Supports Red Book & HSG addressing");
  90.   else cprintf ("Supports HSG addressing mode      ");
  91. }
  92.  
  93.  
  94. void show_mode (void)
  95. {
  96.   gotoxy (60, 11);
  97.   if (playmode == 0)
  98.     printf ("Mode: DISC   ");
  99.   else if(playmode == 1)
  100.     printf ("Mode: TRACK  ");
  101.   else printf ("Mode: SHUFFLE");
  102. }
  103.  
  104.  
  105. void nodisk (void)
  106. {
  107.   textmode (3);
  108.   textbackground (BLACK);
  109.   clrscr ();
  110.   printf ("Drive Error, no disk found.\n\nProgram halted.\n");
  111.   exit (0);
  112. }
  113.  
  114.  
  115. void newdisk (void)
  116. {
  117.   short error_ctr;
  118.  
  119.   textcolor (LIGHTGRAY);
  120.   textbackground (BLACK);
  121.   clrscr ();
  122.   mark[0] = 0;
  123.   curmark = 1;
  124.   playmode = PLAY_DISK;
  125.   textcolor (WHITE);
  126.   for (ctr = 1; ctr < 10; ctr++)
  127.   {
  128.     gotoxy (1, ctr);
  129.     textbackground (RED);
  130.     cprintf ("%39c", 32);
  131.     gotoxy (40, ctr);
  132.     textbackground (BLUE);
  133.     cprintf ("%40c", 32);
  134.   }
  135.   error_ctr = 0;
  136.   gotoxy (54, 9);
  137.   textcolor (WHITE + BLINK);
  138.   cprintf ("WORKING.....");
  139.   do {
  140.     cd_get_audio_info ();
  141.     error_ctr++;
  142.   } while ((cdrom_data.error == 0x8102) && (error_ctr < 500));
  143.   textcolor (LIGHTGRAY);
  144.   gotoxy (54, 9);
  145.   cprintf ("            ");
  146.   if (error_ctr == 500)
  147.     nodisk ();
  148.   if (cdrom_data.high_audio > 30)
  149.     cdrom_data.high_audio = 35;
  150.   for (ctr = cdrom_data.low_audio; ctr <= cdrom_data.high_audio; ctr++)
  151.   {
  152.     gotoxy (1, ctr+9);
  153.     textbackground (MAGENTA);
  154.     textcolor (YELLOW);
  155.     cprintf ("%39c", 32);
  156.   }
  157.   gotoxy (1,1);
  158.   textcolor (WHITE);
  159.   textbackground (RED);
  160.   cprintf ("Barry's CD AUDIO player");
  161.   printf ("\n");
  162.   cprintf ("Copyright 1994");
  163.   printf ("\n\n");
  164.   cprintf ("Number of drives: %i", cdrom_data.drives);
  165.   printf ("\n");
  166.   cprintf ("First drive     : %c", cdrom_data.first_drive+65);
  167.   printf ("\n\n");
  168.  
  169. //  if (playing == FALSE)
  170. //  {
  171. //    cd_getupc ();
  172. //    cprintf ("Disk UPC Code   : Loaded");
  173. //  }
  174.   printf ("\n\n");
  175.   cprintf ("TRACK    LENGTH    TYPE");
  176.  
  177.   textbackground (MAGENTA);
  178.   textcolor (YELLOW);
  179.   for (ctr = cdrom_data.low_audio; ctr <= cdrom_data.high_audio; ctr++)
  180.   {
  181.     gotoxy (1, ctr+9);
  182.     cd_track_length (ctr, &minutes, &seconds, &frames);
  183.     cprintf ("%2d.      %02i:%02i", ctr, minutes, seconds);
  184.     cd_set_track (ctr);
  185.     if (cdrom_data.track_type == DATA_TRACK)
  186.       cprintf ("     Data");
  187.     else cprintf ("     Audio");
  188.   }
  189.   printf ("\nDisk length:   %02d:%02d\n\n", cdrom_data.disk_length_min, cdrom_data.disk_length_sec);
  190.   screeny = wherey ();
  191.  
  192.   if (playing == TRUE)
  193.   {
  194.     gotoxy (1, screeny);
  195.     printf ("Disk play time :");
  196.   }
  197.   cd_get_volume (&my_vol);
  198.   gotoxy (45, 11);
  199.   printf ("Volume: %3i", my_vol.volume0);
  200.   show_mode ();
  201.   show_status ();
  202.   gotoxy (45, 13);
  203.   printf ("Q         Quit");
  204.   gotoxy (45, 15);
  205.   printf ("P         Play");
  206.   gotoxy (45, 16);
  207.   printf ("P         Pause/Resume");
  208.   gotoxy (45, 17);
  209.   printf ("SPACE     Stop Song");
  210.   gotoxy (45, 18);
  211.   printf ("K         Karaoke Mark");
  212.   gotoxy (45, 20);
  213.   printf ("V         Full Volume");
  214.   gotoxy (45, 21);
  215.   printf ("M         Mute");
  216.   gotoxy (45, 22);
  217.   printf ("+         Increase Volume");
  218.   gotoxy (45, 23);
  219.   printf ("-         Decrease Volume");
  220.   gotoxy (45, 25);
  221.   printf ("E         Eject Tray");
  222.   gotoxy (45, 26);
  223.   printf ("C         Close Tray");
  224.   gotoxy (45, 27);
  225.   printf ("L         Lock Door");
  226.   gotoxy (45, 28);
  227.   printf ("U         Unlock Door");
  228.   gotoxy (45, 30);
  229.   printf ("D         Disk mode");
  230. }
  231.  
  232.  
  233. short play_song (void)
  234. {
  235.   short temp;
  236.   unsigned long startpos, endpos;
  237.  
  238.   curcheck = 1;
  239.   if (playmode != PLAY_SHUFFLE)
  240.   {
  241.     gotoxy (1, 49);
  242.     printf ("Enter track to play: ");
  243.     scanf ("%i", &ctr);
  244.     gotoxy (1, 49);
  245.     printf ("                                            ");
  246.     if ((ctr < cdrom_data.low_audio) || (ctr > cdrom_data.high_audio))
  247.       return 0;
  248.     cd_set_track (ctr);
  249.   }
  250.   else cd_set_track ((rand () % cdrom_data.high_audio) + 1);
  251.  
  252.   if (cdrom_data.track_type == DATA_TRACK)
  253.     return 0;
  254.   startpos = cdrom_data.track_position;
  255.   if (playmode == PLAY_DISK)
  256.     endpos = cdrom_data.endofdisk;
  257.   else {
  258.     temp = cdrom_data.current_track;
  259.     if ((temp+1) > cdrom_data.high_audio)
  260.       endpos = cdrom_data.endofdisk;
  261.     else {
  262.       cd_set_track (temp+1);
  263.       endpos = cdrom_data.track_position;
  264.       cd_set_track (temp);
  265.     }
  266.   }
  267.  
  268.   cd_lock (LOCK);
  269.   cd_seek (cdrom_data.track_position);
  270.   delay (400);
  271.   cd_play_audio (startpos, endpos);
  272.   gotoxy (26, 9+cdrom_data.current_track);
  273.   textbackground (MAGENTA);
  274.   textcolor (YELLOW + BLINK);
  275.   cprintf ("PLAYING");
  276.   gotoxy (1, screeny);
  277.   printf ("Disk play time :");
  278.   screeny = wherey ();
  279.   while (cd_done_play ());
  280.   playing = TRUE;
  281.   return 1;
  282. }
  283.  
  284.  
  285. void pause_song (void)
  286. {
  287.   if (paused == FALSE)
  288.   {
  289.     cd_stop_audio ();
  290.     paused = TRUE;
  291.     gotoxy (26, 9+cdrom_data.current_track);
  292.     textcolor (YELLOW + BLINK);
  293.     printf ("PAUSED ");
  294.   }
  295.   else {
  296.     cd_resume_audio ();
  297.     paused = FALSE;
  298.     gotoxy (26, 9+cdrom_data.current_track);
  299.     textcolor (YELLOW + BLINK);
  300.     printf ("PLAYING");
  301.   }
  302. }
  303.  
  304.  
  305. void main (void)
  306. {
  307.   short error_ctr;
  308.   char tempstr[8];
  309.  
  310.   if (!cdrom_installed ())
  311.   {
  312.     printf ("No CD-ROM drive found.\n");
  313.     exit (0);
  314.   }
  315.  
  316.   if (cd_done_play ())
  317.     playing = FALSE;
  318.   else playing = TRUE;
  319.   paused = FALSE;
  320.   done = FALSE;
  321.   my_vol.input0 = 0;
  322.   my_vol.input1 = 1;
  323.   my_vol.input2 = 2;
  324.   my_vol.input3 = 3;
  325.  
  326.   textmode (C4350);
  327.   newdisk ();
  328.   while (done == FALSE)
  329.   {
  330.     cd_status ();
  331.     if (oldstatus != cdrom_data.status)
  332.     {
  333.       show_status ();
  334.       if ((cdrom_data.status & 1) == 0)
  335.       {
  336.     /* Preserve previous DISK ID */
  337.     disklen = cdrom_data.endofdisk;
  338.     /* Get the new one */
  339.     error_ctr = 0;
  340.     gotoxy (54, 9);
  341.     textcolor (WHITE + BLINK);
  342.     cprintf ("WORKING.....");
  343.     do {
  344.       cd_get_audio_info ();
  345.       error_ctr++;
  346.     } while ((cdrom_data.error == 0x8102) && (error_ctr < 2500));
  347.     textcolor (LIGHTGRAY);
  348.     gotoxy (54, 9);
  349.     cprintf ("            ");
  350.     if (error_ctr == 2500)
  351.       nodisk ();
  352.     /* See if disk was changed */
  353.     if (disklen != cdrom_data.endofdisk)
  354.       newdisk ();
  355.       }
  356.     }
  357.     if (kbhit ())
  358.     {
  359.     ch = toupper (getch ());
  360.     switch (ch) {
  361.       case 'Q' : done = TRUE;
  362.          break;
  363.       case 'P' : if (playing == TRUE)
  364.            pause_song ();
  365.          else play_song ();
  366.          break;
  367.       case ' ' : cd_stop_audio ();
  368.          cd_lock (UNLOCK);
  369.          playing = FALSE;
  370.          gotoxy (26, 9+cdrom_data.current_track);
  371.          textbackground (MAGENTA);
  372.          textcolor (YELLOW);
  373.          cprintf ("              ");
  374.          gotoxy (1, screeny);
  375.          printf ("                              ");
  376.          gotoxy (1, screeny+1);
  377.          printf ("                                 ");
  378.          break;
  379.       case 'E' : if (playing == FALSE)
  380.            cd_cmd (EJECT_TRAY);
  381.          break;
  382.       case 'C' : if (playing == FALSE)
  383.          {
  384.            gotoxy (54, 9);
  385.            textcolor (WHITE + BLINK);
  386.            cprintf ("WORKING.....");
  387.            cd_cmd (CLOSE_TRAY);
  388.            /* Preserve previous DISK ID */
  389.            disklen = cdrom_data.endofdisk;
  390.            /* Get the new one */
  391.            error_ctr = 0;
  392.            do {
  393.              cd_get_audio_info ();
  394.              error_ctr++;
  395.            } while ((cdrom_data.error == 0x8102) && (error_ctr < 1000));
  396.            if (error_ctr == 1000)
  397.              nodisk ();
  398.            textcolor (LIGHTGRAY);
  399.            gotoxy (54, 9);
  400.            cprintf ("            ");
  401.            /* See if disk was changed */
  402.            if (cdrom_data.endofdisk != disklen)
  403.              newdisk ();
  404.          }
  405.          break;
  406.       case 'K' : mark[curmark++] = cd_head_position ();
  407.          mark[0] = cdrom_data.current_track;
  408.          break;
  409.       case 'V' : my_vol.volume0 = 255;
  410.          my_vol.volume1 = 255;
  411.          my_vol.volume2 = 255;
  412.          my_vol.volume3 = 255;
  413.          cd_set_volume (&my_vol);
  414.          gotoxy (45, 11);
  415.          printf ("Volume: %3i", my_vol.volume0);
  416.          break;
  417.       case 'M' : my_vol.volume0 = 90;
  418.          my_vol.volume1 = 90;
  419.          my_vol.volume2 = 90;
  420.          my_vol.volume3 = 90;
  421.          cd_set_volume (&my_vol);
  422.          gotoxy (45, 11);
  423.          printf ("Volume: %3i", my_vol.volume0);
  424.          break;
  425.       case '+' : cd_get_volume (&my_vol);
  426.          if (my_vol.volume0 < 255)
  427.            my_vol.volume0++;
  428.          if (my_vol.volume1 < 255)
  429.            my_vol.volume1++;
  430.          if (my_vol.volume2 < 255)
  431.            my_vol.volume2++;
  432.          if (my_vol.volume3 < 255)
  433.            my_vol.volume3++;
  434.          cd_set_volume (&my_vol);
  435.          gotoxy (45, 11);
  436.          printf ("Volume: %3i", my_vol.volume0);
  437.          break;
  438.       case '-' : cd_get_volume (&my_vol);
  439.          if (my_vol.volume0 > 0)
  440.            my_vol.volume0--;
  441.          if (my_vol.volume1 > 0)
  442.            my_vol.volume1--;
  443.          if (my_vol.volume2 > 0)
  444.            my_vol.volume2--;
  445.          if (my_vol.volume3 > 0)
  446.            my_vol.volume3--;
  447.          cd_set_volume (&my_vol);
  448.          gotoxy (45, 11);
  449.          printf ("Volume: %3i", my_vol.volume0);
  450.          break;
  451.       case 'D' : if (playing == FALSE)
  452.          {
  453.            playmode++;
  454.            if (playmode > PLAY_SHUFFLE)
  455.              playmode = PLAY_DISK;
  456.            show_mode ();
  457.          }
  458.          break;
  459.       case 'L' : cd_lock (LOCK);
  460.          break;
  461.       case 'U' : if (playing == FALSE)
  462.            cd_lock (UNLOCK);
  463.          break;
  464.     }
  465.     }
  466.     if (playing == TRUE)
  467.     {
  468.       if ((paused == FALSE) && (cd_done_play ()))
  469.       {
  470.     playing = FALSE;
  471.     cd_stop_audio ();
  472.     cd_lock (UNLOCK);
  473.     gotoxy (26, 9+cdrom_data.current_track);
  474.     textbackground (MAGENTA);
  475.     textcolor (YELLOW);
  476.     cprintf ("              ");
  477.     gotoxy (1, screeny);
  478.     printf ("                                 ");
  479.     gotoxy (1, screeny+1);
  480.     printf ("                                 ");
  481.     if (playmode == PLAY_SHUFFLE)
  482.       play_song ();
  483.       }
  484.       else {
  485.     cd_getpos (&my_cd);
  486.     sprintf ((char *)&tempstr, "%x", my_cd.track);
  487.     my_cd.track = (unsigned char) atol ((char *)&tempstr);
  488.     if ((my_cd.track != cdrom_data.current_track) &&
  489.         (my_cd.track <= cdrom_data.high_audio) &&
  490.         (my_cd.track >= cdrom_data.low_audio))
  491.     {
  492.       textbackground (MAGENTA);
  493.       textcolor (YELLOW);
  494.       gotoxy (26, 9+cdrom_data.current_track);
  495.       cprintf ("              ");
  496.       textcolor (YELLOW + BLINK);
  497.       cdrom_data.current_track = my_cd.track;
  498.       gotoxy (26, 9+cdrom_data.current_track);
  499.       cprintf ("PLAYING");
  500.     }
  501.     textbackground (MAGENTA);
  502.     textcolor (YELLOW);
  503.     gotoxy (35, 9+cdrom_data.current_track);
  504.     cprintf ("%02i:%02i", my_cd.min, my_cd.sec);
  505.     gotoxy (19, screeny);
  506.     printf ("%02i:%02i", my_cd.amin, my_cd.asec);
  507.     if (mark[0] == cdrom_data.current_track)
  508.     {
  509.       while ((mark[curcheck] <= cd_head_position ()) && (curcheck < curmark))
  510.       {
  511.         gotoxy (1, screeny+1);
  512.         printf ("Passed mark #%i", curcheck);
  513.         curcheck++;
  514.       }
  515.     }
  516.       }
  517.     }
  518.   }
  519.   textmode (C80);
  520.   clrscr ();
  521.   if (playing == TRUE)
  522.   {
  523.     printf ("Stop audio (Y/N) ?   ");
  524.     do {
  525.       ch = toupper (getch ());
  526.     } while ((ch != 'Y') && (ch != 'N'));
  527.     if (ch == 'Y')
  528.     {
  529.       cd_stop_audio ();
  530.       cd_lock (UNLOCK);
  531.     }
  532.   }
  533. }